Syntax10.Scn.Fnt StampElems Alloc 4 May 95 ParcElems Alloc Syntax10i.Scn.Fnt MODULE Clipboard; (** mf / mah 29.8.94 ( IMPORT Kernel, Texts, TextFrames, Macintosh, Oberon, MenuViewers, Viewers, Fonts; TYPE Scrap=POINTER TO ScrapDesc; ScrapDesc=RECORD (Texts.TextDesc) (* extension of standard TextDesc in order to keep track of changes *) changed: BOOLEAN END; scrap: Scrap; ClipB: Texts.Buffer; M: Oberon.CopyOverMsg; W: Texts.Writer; PROCEDURE ConvertCharFromOberon (VAR ch: CHAR); BEGIN CASE ch OF ': ch := CHR (138) | ' ': ch := CHR (154) | ' ': ch := CHR (159) (* | ' ': ch := CHR (128) *) | ' ': ch := CHR (133) | ' ': ch := CHR (134) ELSE END END ConvertCharFromOberon; PROCEDURE ConvertCharToOberon (VAR ch: CHAR); BEGIN CASE ORD (ch) OF 138: ch := ' | 154: ch := ' | 159: ch := ' (* | 128: ch := ' | 133: ch := ' | 134: ch := ' ELSE END END ConvertCharToOberon; PROCEDURE Cut*; VAR t: Texts.Text; beg, end, time: LONGINT; BEGIN Texts.Delete (scrap, 0, scrap.len); Oberon.GetSelection (t, beg, end, time); IF time >= 0 THEN Texts.Save (t, beg, end, ClipB); Texts.Delete (t, beg, end); Texts.Append (scrap, ClipB) END; END Cut; PROCEDURE Copy*; VAR t: Texts.Text; beg, end, time: LONGINT; BEGIN Texts.Delete (scrap, 0, scrap.len); Oberon.GetSelection (t, beg, end, time); IF time >= 0 THEN Texts.Save(t, beg, end, ClipB); Texts.Append(scrap, ClipB) END END Copy; PROCEDURE Paste*; BEGIN IF scrap.len > 0 THEN M.text:=scrap; M.beg:=0; M.end:=scrap.len; Oberon.FocusViewer.handle (Oberon.FocusViewer, M) END END Paste; PROCEDURE Show*; VAR V: Viewers.Viewer; X, Y: INTEGER; BEGIN Oberon.AllocateUserViewer (Oberon.Par.vwr.X, X, Y); V:=MenuViewers.New (TextFrames.NewMenu ("Clipboard", "^Edit.Menu.Text"), TextFrames.NewText (scrap, 0), TextFrames.menuH, X, Y) END Show; PROCEDURE* Import; VAR run: ARRAY 1024 OF CHAR; i, len: INTEGER; fname: ARRAY 32 OF CHAR; BEGIN IF Macintosh.convertClip THEN Texts.Delete (scrap, 0, scrap.len); Macintosh.GetScrap; Macintosh.GetRun (run, len, fname); WHILE len > 0 DO Texts.SetFont (W, Fonts.This (fname)); i:=0; WHILE i < len DO ConvertCharToOberon (run[i]); Texts.Write (W, run[i]); INC (i) END; Macintosh.GetRun (run, len, fname) END; Texts.Append (scrap, W.buf); scrap.changed:=FALSE END END Import; PROCEDURE* Export; VAR R: Texts.Reader; run: ARRAY 1024 OF CHAR; ch: CHAR; len: INTEGER; fnt: Fonts.Font; BEGIN IF Macintosh.convertClip & scrap.changed THEN Texts.OpenReader (R, scrap, 0); Texts.Read (R, ch); WHILE ~R.eot DO run[0]:=ch; fnt:=R.fnt; len:=1; Texts.Read (R, ch); WHILE (~R.eot) & (R.fnt=fnt) & (len < 1024) DO ConvertCharFromOberon (ch); run[len]:=ch; Texts.Read (R, ch); INC (len) END; Macintosh.PutRun (run, len, fnt.name) END; Macintosh.PutScrap; scrap.changed:=FALSE END END Export; PROCEDURE* Notify (T: Texts.Text; op: INTEGER; beg, end: LONGINT); BEGIN T(Scrap).changed:=TRUE; TextFrames.NotifyDisplay (T, op, beg, end) END Notify; BEGIN Texts.OpenWriter (W); NEW (ClipB); Texts.OpenBuf (ClipB); NEW (scrap); scrap.notify:=Notify; Texts.Open (scrap, ""); Macintosh.suspendQ.Add (Export); Kernel.quitQ.Add (Export); Macintosh.resumeQ.Add (Import); Macintosh.convertClip:=TRUE; Import END Clipboard.